package cn.tedu.lbs.marketing.web.consumer;

import cn.tedu.lbs.marketing.web.service.ActivityService;
import cn.tedu.lbs.marketing.web.service.UserCouponService;
import com.tarena.lbs.pojo.basic.event.LocationEvent;
import com.tarena.lbs.pojo.marketing.param.UserCouponsParam;
import com.tarena.lbs.pojo.marketing.po.ActivityPO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 调用业务层 异步通信 订阅通信的接口入口
 * 计算给谁 发送哪张优惠券 复用之前领取优惠券业务方法
 */
@Component
@Slf4j
public class AutoPublishCouponConsumer {
    @Autowired
    private ActivityService activityService;
    @Autowired
    private UserCouponService userCouponService;
    /**
     * 定义一个消费方法 将消息中的用户 和店铺
     * 根据店铺中 活动携带的优惠券 给用户自动发放优惠券
     * 将方法绑定 input通道
     */
    @StreamListener("store-location-input")
    public void autoPublishCoupon(LocationEvent event){
        //1.调用活动业务 查询满足这个店铺 满足自动营销 满足活动奖励是优惠券这些条件
        List<ActivityPO> activities=activityService.getAvailableActivities(event.getStoreId());
        log.info("满足条件的活动有:{}",activities);
        //2.对于满足条件的活动 多个 循环处理 每循环一个活动 封装一个领取入参UserCouponsParam
        if (activities!=null&&activities.size()>0){
            for (ActivityPO activity : activities) {
                //每次循环 封装一个领取优惠券的对象
                UserCouponsParam param=new UserCouponsParam();
                param.setUserId(event.getUserId());
                param.setActivityId(activity.getId());
                param.setCouponId(activity.getRewardCouponId());
                //领取优惠券的渠道 和活动页面领取 不一样的 receiveChannel 2
                param.setReceiveChannel(2);
                param.setShopId(event.getStoreId());
                //复用takeCoupon
                try{
                    userCouponService.takeCoupon(param);
                    //UNDO 可以通过websocket 发送消息通知
                }catch (Exception e){
                    log.error("自动下发优惠券失败,userId:{}",event.getUserId(),e);
                }
            }
        }
    }







}
